package com.plexpt.chatgptonlinejava.app;

import com.knuddels.jtokkit.Encodings;
import com.knuddels.jtokkit.api.Encoding;
import com.knuddels.jtokkit.api.EncodingRegistry;
import com.knuddels.jtokkit.api.ModelType;
import com.unfbx.chatgpt.utils.TikTokensUtil;
import lombok.Data;

@Data
public class Result {

    String status = "success";

    String msg;
    String message;
    String raw_message;

    public static Result ok(String text) {
        Result result = new Result();
        result.setRaw_message(text);
        result.buildMsg();

        return result;
    }

    public static Result error(String message) {
        Result result = new Result();
        result.setMessage(message);
        result.setRaw_message(message);
        return result;

    }

    public void buildMsg() {
        message = "<p>" + raw_message + "</p>\n";
    }


    public static void main(String[] args) {
        String content = "要提高Redis的读写速度，可以考虑以下几个方面的优化措施：\n" +
                "\n" +
                "1. 使用合适的硬件：选择性能良好的硬件设备，包括CPU、内存和存储介质。快速的CPU和足够的内存可以提高Redis的处理能力和响应速度。使用高性能的固态硬盘（SSD）或者基于内存的存储（如Redis Cluster或Redis Sentinel）可以加快读写操作的速度。\n" +
                "\n" +
                "2. 优化数据模型：设计合理的数据结构和键命名规范，以适应具体的业务需求。使用哈希表、列表、有序集合等适当的数据结构可以提高查询和更新的效率。此外，合理地使用数据分片、分区和主从复制等机制可以分散负载和提高并发性能。\n" +
                "\n" +
                "3. 设置合适的配置参数：根据实际情况，调整Redis的配置参数以优化性能。例如，增加最大连接数（maxclients）和最大内存限制（maxmemory），适当调整并发连接数和线程池大小等。注意要根据系统资源和需求进行平衡，避免超过系统的承载能力。\n" +
                "\n" +
                "4. 使用持久化机制和快照：根据数据的重要性和可容忍的数据丢失程度，选择合适的持久化方式，如RDB快照或AOF日志。定期进行数据备份和快照，以防止数据丢失，并在需要时进行快速的恢复。\n" +
                "\n" +
                "5. 考虑使用Redis集群或主从复制：通过将数据分布到多个Redis节点，可以增加系统的容量和负载均衡能力。Redis集群可以实现数据的自动分片和故障转移，提高读写的并发性和可用性。\n" +
                "\n" +
                "6. 优化客户端访问：合理使用Redis的批量操作和管道技术，减少客户端与Redis服务器之间的通信次数。这可以有效减少网络延迟和提高整体的吞吐量。\n" +
                "\n" +
                "7. 使用合适的缓存策略：根据具体的业务需求，设置合适的缓存过期时间和淘汰策略。合理利用Redis的LRU（最近最少使用）或LFU（最近最不常用）算法，以及过期策略，可以提高缓存的命中率和性能。\n" +
                "\n" +
                "以上只是一些常见的优化措施，具体的优化方案需要根据实际情况进行调整和测试。在进行任何优化之前，建议先进行性能评估和基准测试，以确定性能瓶颈和优化的重点。";
        EncodingRegistry registry = Encodings.newDefaultEncodingRegistry();
        Encoding enc = registry.getEncodingForModel(ModelType.GPT_3_5_TURBO);
        long begin = System.currentTimeMillis();
        System.out.println(enc.countTokens(content));
        long end = System.currentTimeMillis();
        System.out.println("消耗的时间: " + (end - begin));
        begin = System.currentTimeMillis();
        System.out.println(TikTokensUtil.tokens(ModelType.GPT_3_5_TURBO.getName(), content));
        end = System.currentTimeMillis();
        System.out.println("消耗的时间: " + (end - begin));
    }
}
